package co.com.desarrollo.pedidos.services.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import co.com.desarrollo.pedidos.dao.ConfisysDAO;
import co.com.desarrollo.pedidos.dao.EstadoPedidoDAO;
import co.com.desarrollo.pedidos.dao.RolDAO;
import co.com.desarrollo.pedidos.entities.Confisys;
import co.com.desarrollo.pedidos.entities.EstadoPedido;
import co.com.desarrollo.pedidos.entities.Rol;
import co.com.desarrollo.pedidos.services.GeneralService;
import co.com.desarrollo.pedidos.services.exceptions.ConfisysNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.EstadoPedidoNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.RolNotFoundException;

@Service("generalService")
public class GeneralServiceImpl implements GeneralService {

	@Autowired
	private ConfisysDAO confisysDAO;
	@Autowired
	private RolDAO rolDAO;
	@Autowired
	private EstadoPedidoDAO estadoPedidoDAO;

	@Override
	public void deleteConfisysById(Confisys confisys) {
		confisysDAO.delete(confisys.getId());
	}

	@Override
	public List<Confisys> getAllConfisys() {
		return confisysDAO.findAll();
	}

	@Override
	public Confisys getConfisysById(Confisys confisys) {
		return confisysDAO.findById(confisys.getId());
	}

	@Override
	public Confisys getConfisysByName(Confisys confisys) {
		return confisysDAO.findByName(confisys.getNombre());
	}

	@Override
	public Confisys setConfisys(Confisys confisys) {
		return confisysDAO.store(confisys);
	}

	@Override
	public void deleteRolById(Rol rol) {
		rolDAO.delete(rol.getIdrol());
	}

	@Override
	public List<Rol> getAllRoles() {
		return rolDAO.findAll();
	}

	@Override
	public Rol getRolById(Rol rol) {
		return rolDAO.findById(rol.getIdrol());
	}

	@Override
	public Rol getRolByName(Rol rol) {
		return rolDAO.findByName(rol.getNombre());
	}

	@Override
	public Rol setRol(Rol rol) {
		return rolDAO.store(rol);
	}

	@Override
	public void deleteEstadoPedidoById(EstadoPedido estadoPedido) {
		estadoPedidoDAO.delete(estadoPedido.getIdestadoPedido());
	}

	@Override
	public List<EstadoPedido> getAllEstadosPedido() {
		return estadoPedidoDAO.findAll();
	}

	@Override
	public EstadoPedido getEstadoPedidoById(EstadoPedido estadoPedido) {
		return estadoPedidoDAO.findById(estadoPedido.getIdestadoPedido());
	}

	@Override
	public EstadoPedido getEstadoPedidoByName(EstadoPedido estadoPedido) {
		return estadoPedidoDAO.findByName(estadoPedido.getNombre());
	}

	@Override
	public EstadoPedido setEstadoPedido(EstadoPedido estadoPedido) {
		return estadoPedidoDAO.store(estadoPedido);
	}

	@Override
	public Confisys findConfisysMethods(Confisys confisys) throws ConfisysNotFoundException {
		Confisys confisysFound = getConfisysById(confisys);
		if (confisysFound == null)
			confisys = getConfisysByName(confisys);
		else
			confisys = confisysFound;
		if (confisys != null)
			return confisys;
		throw new ConfisysNotFoundException("El confisys solicitado no existe.");
	}

	@Override
	public EstadoPedido findEstadoPedidoMethods(EstadoPedido estadoPedido) throws EstadoPedidoNotFoundException {
		EstadoPedido estadoPedidoFound = getEstadoPedidoById(estadoPedido);
		if (estadoPedidoFound == null)
			estadoPedido = getEstadoPedidoByName(estadoPedido);
		else
			estadoPedido = estadoPedidoFound;
		if (estadoPedido != null)
			return estadoPedido;
		throw new EstadoPedidoNotFoundException("El estado pedido solicitado no existe.");
	}

	@Override
	public Rol findRolMethods(Rol rol) throws RolNotFoundException {
		Rol rolFound = getRolById(rol);
		if (rolFound == null)
			rol = getRolByName(rol);
		else
			rol = rolFound;
		if (rol!=null)
			return rol;
		throw new RolNotFoundException("El rol solicitado no existe.");
	}

}
